PROJECT = "BLE"
VERSION = "1.0.0"
require 'log'
LOG_LEVEL = log.LOGLEVEL_TRACE
require "sys"
require "net"
require 'console'
require 'misc'

--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
net.startQueryAll(60000, 60000)

--此处关闭RNDIS网卡功能
--否则，模块通过USB连接电脑后，会在电脑的网络适配器中枚举一个RNDIS网卡，电脑默认使用此网卡上网，导致模块使用的sim卡流量流失
--如果项目中需要打开此功能，把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
--注意：core固件：V0030以及之后的版本、V3028以及之后的版本，才以稳定地支持此功能
ril.request("AT+RNDISCALL=0,1")

--加载控制台调试功能模块（此处代码配置的是uart1，波特率115200）
--此功能模块不是必须的，根据项目需求决定是否加载
--使用时注意：控制台使用的uart不要和其他功能使用的uart冲突
--使用说明参考demo/console下的《console功能使用说明.docx》
require "console"
console.setup(1, 115200)

--加载网络指示灯和LTE指示灯功能模块
--根据自己的项目需求和硬件配置决定：1、是否加载此功能模块；2、配置指示灯引脚
--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1，LTE指示灯引脚为pio.P0_4
require "netLed"
pmd.ldoset(2,pmd.LDO_VLCD)
netLed.setup(true,pio.P0_1,pio.P0_4)


local function init()
	rtos.on(rtos.MSG_BLUETOOTH, function(msg)
			if msg.event == btcore.MSG_OPEN_CNF then
					sys.publish("BT_OPEN", msg.result) --蓝牙打开成功
			elseif msg.event == btcore.MSG_CLOSE_CNF then
					log.info("bt", "ble close") --蓝牙关闭成功
			elseif msg.event == btcore.MSG_BLE_CONNECT_CNF then
					sys.publish("BT_CONNECT_IND", {["handle"] = msg.handle, ["result"] = msg.result}) --蓝牙连接成功
			elseif msg.event == btcore.MSG_BLE_DISCONNECT_CNF then
					log.info("bt", "ble disconnect") --蓝牙断开连接
			elseif msg.event == btcore.MSG_BLE_DATA_IND then
					sys.publish("BT_DATA_IND", {["data"] = msg.data, ["uuid"] = msg.uuid, ["len"] = msg.len})  --接收到的数据内容
			elseif msg.event == btcore.MSG_BLE_SCAN_CNF then
					sys.publish("BT_SCAN_CNF", msg.result) --打开扫描成功
			elseif msg.event == btcore.MSG_BLE_SCAN_IND then
					sys.publish("BT_SCAN_IND", {["name"] = msg.name, ["addr_type"] = msg.addr_type, ["addr"] = msg.addr, ["manu_data"] = msg.manu_data, 
					["raw_data"] = msg.raw_data, ["raw_len"] = msg.raw_len, ["rssi"] = msg.rssi})  --接收到扫描广播包数据
			elseif msg.event == btcore.MSG_BLE_FIND_CHARACTERISTIC_IND then
					sys.publish("BT_FIND_CHARACTERISTIC_IND", msg.result)  --发现服务包含的特征
			elseif msg.event == btcore.MSG_BLE_FIND_SERVICE_IND then
					log.info("bt", "find service uuid",msg.uuid)  --发现蓝牙包含的16bit uuid
					if msg.uuid == 0x1800 then          --根据想要的uuid修改 0x1800
							sys.publish("BT_FIND_SERVICE_IND", msg.result)
					end
			elseif msg.event == btcore.MSG_BLE_FIND_CHARACTERISTIC_UUID_IND then
					uuid_c = msg.uuid
					log.info("bt", "find characteristic uuid", msg.uuid, type(msg.uuid)) --发现到服务内包含的特征uuid
			elseif msg.event == btcore.MSG_BLE_DATA_IND then --蓝牙收到消息
					--此处根据自己需要的业务逻辑来处理，当收到蓝牙消息时，使用 btcore.recv() 读取即可
					log.info("bt", "BT_DATA_IND", msg.result)
					local result, data  = btcore.recv(10)
					if result then 
						log.info("bt", "BT_DATA_IND message", string.fromHex(data))
					end
			end
	end)
end
-- 打开蓝牙
local function poweron()
	log.info("bt", "poweron")
	btcore.open(1) --打开蓝牙主模式
	_, result = sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功
	if  result ~= 0 then --5秒超时没收到蓝牙打开成功的消息，则返回失败
			return false
	end
end

local function scan()
	--btcore.setscanparam(1,48,6,0,0)--扫描参数设置（扫描类型,扫描间隔,扫描窗口,扫描过滤测量,本地地址类型）
	--如果不设置扫描参数，则使用默认的值
	 btcore.scan(1) --开启扫描
	 _, result = sys.waitUntil("BT_SCAN_CNF", 50000) --等待扫描打开成功
	 if result ~= 0 then    
			 return false
	 end

	 while true do         --循环等待扫描到的蓝牙信息
			 _, bt_device = sys.waitUntil("BT_SCAN_IND") --等待扫描回复数据

					--蓝牙信息包括以下几种：蓝牙名称、蓝牙信号强度、地址种类（Public Device Address、Random Device Address），蓝牙mac地址、厂商数据、广播包/响应包数据
					--  log.info("bt", "scan result")
					--  log.info("bt.scan_name", bt_device.name)  --蓝牙名称
					--  log.info("bt.rssi", bt_device.rssi)  --蓝牙信号强度
					--  log.info("bt.addr_type", bt_device.addr_type) --地址种类
					--  log.info("bt.scan_addr", bt_device.addr) --蓝牙地址
					--  if bt_device.manu_data ~= nil then      --厂商数据可能为空
					-- 		 log.info("bt.manu_data", string.toHex(bt_device.manu_data)) --厂商数据
					--  end
					--  log.info("bt.raw_len", bt_device.raw_len)
					--  if bt_device.raw_data ~= nil then
					-- 		 log.info("bt.raw_data", string.toHex(bt_device.raw_data)) --广播包原始数据
					--  end

					 --蓝牙连接   根据设备蓝牙广播数据协议解析广播原始数据(bt_device.raw_data)
					 if (bt_device.name == "LOS-01470B255100" or bt_device.addr == "00:51:25:0b:47:01") then   --连接的蓝牙名称根据要连接的蓝牙设备修改
							log.info("尝试开始连接")
							 name = bt_device.name                    --蓝牙名称
							 addr_type = bt_device.addr_type      --地址类型
							 addr = bt_device.addr                       --蓝牙地址
							 manu_data = bt_device.manu_data  --厂商数据
							 adv_data = bt_device.raw_data -- 广播包数据 根据蓝牙广播包协议解析
							 btcore.scan(0)  --停止扫描 
							 btcore.connect(addr, addr_type)    --连接蓝牙，蓝牙mac地址，地址类型
							 return true
					 end 
	 end
	 return true
end

local function find_uuid()

	_, bt_connect = sys.waitUntil("BT_CONNECT_IND") --等待连接成功
	if bt_connect.result ~= 0 then
			return false
	end
	--链接成功
	log.info("bt 连接成功", bt_connect.handle)--蓝牙连接句柄
	log.info("bt", "find all service uuid")
	btcore.findservice()--发现所有16bit服务uuid
	_, result = sys.waitUntil("BT_FIND_SERVICE_IND") --等待发现uuid
	log.info("bt", "find service uuid result", result)
	if not result then
			return false
	end

	-- 手机上和 从站是 0x380d  0d38 => 3384
	btcore.findcharacteristic(3384)--发现服务包含的特征,fee0为测试时设置的服务uuid  0xfee0
	_, result = sys.waitUntil("BT_FIND_CHARACTERISTIC_IND") --等待发现服务包含的特征成功
	log.info("bt", "find characteristic", result)
	if not result then
			return false
	end
	-- 0x6145 也试过
	-- btcore.opennotification(0xFF32); --打开通知 对应特征uuid ，ff01为特征uuid，具有notify属性  0xfee2
	-- log.info("bt.send", "Hello I'm LuatOS-Air BLE")
end

local function data_trans()
	sys.wait(2000)
	log.info("进行发送数据开始:")
	while true do
		local time = os.time()
		local data = 0x09
		if time % 2 == 0 then
			data = 0x06
		end
		log.info("发送数据：", data)
		
		-- 手机也是这个 从站 FF31   不过是反位的 0x31ff
		btcore.send(string.char(data), 0x31ff, bt_connect.handle) --发送数据(数据 对应特征uuid 连接句柄)
		_, bt_recv = sys.waitUntil("BT_DATA_IND") --等待接收到数据
				local data = ""
				local len = 0
				local uuid = ""
				while true do
						local recvuuid, recvdata, recvlen = btcore.recv(10)
						if recvlen == 0 then
								log.info(" 无数据 跳出循环")
								break
						end
						uuid = recvuuid
						len = len + recvlen
						data = data .. recvdata
				end
				if len ~= 0 then
				log.info("bt.recv_data", string.toHex(data))
				log.info("bt.recv_data len", len)
				log.info("bt.recv_uuid",string.toHex(uuid)) -- F3FF 手机上是 fff3
				end
		end
		sys.wait(2000)
end

sys.taskInit(function()
	while true do
		sys.wait(5000)  --此处延时是为了可以从luatools看到打印的日志
		init()
		poweron()
		scan()
		find_uuid()
		data_trans()
	end
end)

sys.init(0, 0)
sys.run()